<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        //给对象添加属性有几种方法？

        //1. 创建对象的时候，直接在字面量中添加
        // var obj = {name: ""}
        // //2. 点语法
        // obj.name = "";
        // //3. 关联数组语法
        // obj["name"] = "";


        var nameValue;

        //4. 利用Object.defineProperty方法添加属性
        var obj = {age: ""};
        // Object.defineProperty(对象名, 要添加的属性名, 属性的描述信息对象);
        Object.defineProperty(obj, "name", {
            //writable用来设置属性是否可以被赋值：默认是false
            // writable: true,
            //enumerable用来设置属性是否可以被for-in遍历，默认是false
            enumerable: true,
            //configurable用来设置属性是否可以被删除，默认是false
            configurable: true,
            //给属性一个默认的属性值
            // value: "zcm",

            //属性的设置和访问器  不能和上面的value还有writabel属性共存
            set: function(value){
                //这个函数会在属性被赋值的时候自动调用
                //set方法中，需要将用户给属性赋的值找个地方保存起来
                // nameValue = value;
                // console.log("属性被赋值了", value);

                //在set方法中，就相当于提供了一个可以对用户赋值的数据进行校验的地方
                if(value.length < 2 || value.length > 5){
                    console.error("你赋值的名字不合法，我已经帮你默认设置成赵春梅了");
                    nameValue = "赵春梅";
                }else{
                    nameValue = value;
                }
            },
            get: function(){
                //这个函数会在属性被获取值的时候自动调用
                // 用户获取到的属性的值，其实就是get方法的返回值
                // console.log("属性被取值了"); 
                return nameValue;               
            }
        })

        // for(var k in obj){
        //     console.log(k);
        // }

        



        //需求： 需要在name属性被赋值的时候，做一些事情
        //       监听name属性的变化
        //实际应用场景： 在name发生变化的时候，判断赋的值是不是符合要求
        // obj.name = "123";
        // obj.name = "尼古拉斯·孟浩·巴巴耶夫司机";
    
    </script>
</body>
</html>